﻿using System;
using System.Drawing;
using IAnalyze;
using IScript;
using IAlarm;

namespace IVideo
{
    #region 事件类型
    /// <summary>
    /// 获取云台水平角的事件参数
    /// </summary>
    public class HorizonEventArgs : EventArgs
    {
        /// <summary>
        /// 云台的水平角度
        /// </summary>
        public readonly short Horizon;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="horizon">云台的水平角度</param>
        public HorizonEventArgs(short horizon)
        {
            this.Horizon = horizon;
        }
    }

    /// <summary>
    /// 获取云台垂直角的事件参数
    /// </summary>
    public class VerticalEventArgs : EventArgs
    {
        /// <summary>
        /// 云台的垂直角度
        /// </summary>
        public readonly short Vertical;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="vertical">云台的垂直角度</param>
        public VerticalEventArgs(short vertical) { this.Vertical = vertical; }
    }

    /// <summary>
    /// 视频绘制事件参数
    /// </summary>
    public class VideoPaintEventArgs : EventArgs
    {
        /// <summary>
        /// 视频绘图表面
        /// </summary>
        public readonly Graphics Graphics;
        /// <summary>
        /// 获取函数
        /// </summary>
        /// <param name="graphics">视频绘图表面</param>
        public VideoPaintEventArgs(Graphics graphics) { this.Graphics = graphics; }
    }

    public class AlarmEventArgs : EventArgs
    {
        public readonly GroupInfo Group;
        public readonly AlarmInfo Alarm;
        public AlarmEventArgs(GroupInfo group, AlarmInfo alarm)
        {
            this.Group = group;
            this.Alarm = alarm;
        }
    }
    #endregion
    
    /// <summary>
    /// 视频控件的接口，所有的视频控件都遵循这一接口
    /// </summary>
    public interface IVideoBase
    {
        #region 事件接口
        /// <summary>
        /// 报警事件
        /// </summary>
        event EventHandler<AlarmEventArgs> Alarm;

        /// <summary>
        /// 接收云台水平角事件
        /// </summary>
        event EventHandler<HorizonEventArgs> ReceiveHorizon;

        /// <summary>
        /// 接收云台垂直角事件
        /// </summary>
        event EventHandler<VerticalEventArgs> ReceiveVertical;

        /// <summary>
        /// 视频绘图事件
        /// </summary>
        event EventHandler<VideoPaintEventArgs> VideoPaint;
        #endregion

        #region 状态接口
        /// <summary>
        /// 设备是否已经初始化
        /// </summary>
        bool IsInitialized { get; }

        /// <summary>
        /// 是否已经登陆设备
        /// </summary>
        bool IsLogined { get; }

        /// <summary>
        /// 视频是否已经打开
        /// </summary>
        bool IsOpened { get; }

        /// <summary>
        /// 是否正在录像
        /// </summary>
        bool IsRecording { get; }

        /// <summary>
        /// 是否正在识别
        /// </summary>
        bool IsAnalyzing { get; }

        /// <summary>
        /// 是否正在巡航
        /// </summary>
        bool IsCruising { get; }
        #endregion

        #region 属性接口
        /// <summary>
        /// 区域名称
        /// </summary>
        string AreaName { get; }

        /// <summary>
        /// 设备名称
        /// </summary>
        string DeviceName { get; }

        /// <summary>
        ///云台转动的速度：范围1-7
        /// </summary>
        byte PanTiltSpeed { get; }

        /// <summary>
        /// 云台的水平角：范围0-359
        /// </summary>
        short Horizon { get; }

        /// <summary>
        /// 云台的垂直角：范围-75-45
        /// </summary>
        short Vertical { get; }

        /// <summary>
        /// 云台修正角
        ///     云台在正东方向时的角度：范围0-359
        /// </summary>
        short Revise { get; }

        /// <summary>
        /// 设备所处经度
        ///     地图上的水平像素点
        /// </summary>
        uint Longitude { get; }

        /// <summary>
        /// 设备所处纬度
        ///     地图上的垂直像素点
        /// </summary>
        uint Latitude { get; }

        /// <summary>
        /// 设备高度，单位：米
        /// </summary>
        uint High { get; }
        #endregion

        #region 视频接口
        /// <summary>
        /// 初始化设备
        /// </summary>
        /// <param name="area">设备的区域名</param>
        /// <param name="device">设备的设备名</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool Initialize(string area, string device);

        /// <summary>
        /// 登陆编码器
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool LoginEncoder();

        /// <summary>
        /// 登出编码器
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool LogoutEncoder();

        /// <summary>
        /// 开启视频
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool OpenVideo();

        /// <summary>
        /// 关闭视频
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool CloseVideo();

        /// <summary>
        /// 视频抓拍
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool SnapVideo();
        #endregion

        #region 云台接口
        /// <summary>
        /// 云台左转
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool PanLeft(byte speed);

        /// <summary>
        /// 云台右转
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool PanRight(byte speed);

        /// <summary>
        /// 云台上仰
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool TiltUp(byte speed);

        /// <summary>
        /// 云台下俯
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool TiltDown(byte speed);

        /// <summary>
        /// 云台上仰和左转
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool PanLeftTiltUp(byte speed);

        /// <summary>
        /// 云台下俯和左转
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool PanLeftTiltDown(byte speed);

        /// <summary>
        /// 云台上仰和右转
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool PanRightTiltUp(byte speed);

        /// <summary>
        /// 云台下俯和右转
        /// </summary>
        /// <param name="speed">云台转动的速度,范围为1到7</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool PanRightTiltDown(byte speed);

        /// <summary>
        /// 云台停止转动
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool PTZStop();

        /// <summary>
        ///  云台移动至指定水平角度
        /// </summary>
        /// <param name="angle">将要移动到的水平角度</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool GoHorizon(int angle);

        /// <summary>
        /// 云台移动至指定垂直角度
        /// </summary>
        /// <param name="angle">将要移动到的垂直角度</param>
        /// <returns>true表示成功，false表示失败</returns>
        bool GoVertical(int angle);

        /// <summary>
        /// 异步获取云台当前水平角度
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool AsyncGetHorizon();

        /// <summary>
        /// 异步获取云台当前垂直角度
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool AsyncGetVertical();
        #endregion

        #region 镜头接口
        /// <summary>
        /// 焦距变小(倍率变小)
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool ZoomWide();

        /// <summary>
        /// 焦距变大(倍率变大)
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool ZoomTele();

        /// <summary>
        /// 焦点前调
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool FocusNear();

        /// <summary>
        /// 焦点后调
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool FocusFar();

        /// <summary>
        /// 光圈缩小
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool IrisClose();

        /// <summary>
        /// 光圈扩大
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool IrisOpen();
        #endregion

        #region 功能接口
        /// <summary>
        /// 开始录像
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool StartRecord();

        /// <summary>
        /// 停止录像
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool StopRecord();

        /// <summary>
        /// 开始识别
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool StartAnalyze();

        /// <summary>
        /// 停止识别
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool StopAnalyze();

        /// <summary>
        /// 开始巡航
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool StartCruise();

        /// <summary>
        /// 停止巡航
        /// </summary>
        /// <returns>true表示成功，false表示失败</returns>
        bool StopCruise();
        #endregion
    }
}
